/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package supermarket;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import model.*;
import Admin.*;
import Customer.*;

/**
 *
 * @author koag
 */
public class MainForm extends javax.swing.JFrame {

    // logged User
    private Customer User;
    //Ολα τα jPanel
    private List panels = new ArrayList();
    //επιλεγμένο jPanel
    private int SelectedPanelIndex;
    //
    public DBmanager db;

    /**
     * Creates new form MainForm
     */
    public MainForm(DBmanager db, Customer User) {
        // Αποθήκευσε το DBmanager Instance
        this.db = db;
        this.User = User;
        // Φτιάξε την λίστα με τα jPanels
        this.CreatePanelsList();
        initComponents();

        // Δώσε και τίτλο στο Παράθυρο
        this.setTitle(SuperMarket.appTitle);
        ShowHideMenu();
    }

    // Δηλώνει τον χρήστη πριν ανοίξει η φόρμα
    public void SetUser(Customer User) {
        this.User = User;

    }
    // Επιστρέφει τον χρήστη

    public Customer GetUser() {
        return this.User;
    }

    // Δημιουργεί την λίστα με τα jPanels
    private void CreatePanelsList() {
        // Δημιούργησε jPanels instances
        // Και πέρνα τους σαν παράμετρο το DBmanager instance
        // For Admin
        StoresPanel Stores = new StoresPanel(db);
        ProductsPanel Products = new ProductsPanel(db);
        PelatesPanel Pelates = new PelatesPanel(db, this);
        RelateProductsStoresPanel PS = new RelateProductsStoresPanel(db);
        // For customer
        EditProfilPanel EPP = new EditProfilPanel(db, this);
        ChangePasswordPanel CPP = new ChangePasswordPanel(db, this);
        ChecksPanel CP = new ChecksPanel(db, this);

        // The next two Panels are related to each other
        MarketPlacePanel MP = new MarketPlacePanel(db, this);
        ShowBasketPanel SB = new ShowBasketPanel(db, this, MP);
        MP.setShowBasketPanel(SB);

        // Purchases Simulator
        SimulatePurchasesPanel SP = new SimulatePurchasesPanel(db, this);

        // βάλε στην λίστα τα jPanels
        this.panels.add(Stores);
        this.panels.add(Products);
        this.panels.add(Pelates);
        this.panels.add(PS);
        this.panels.add(EPP);
        this.panels.add(CPP);
        this.panels.add(CP);
        this.panels.add(MP);
        this.panels.add(SB);
        this.panels.add(SP);
    }

    // κρύβει/εμφανίζει τα μενού ανάλογα με τα δικαιώματα του χρήστη
    private void ShowHideMenu() {

        boolean isAdmin = this.User.getIsAdmin();

        if (isAdmin) {
            // Είναι Διαχειριστής
            this.m_Diaxeirisi.setVisible(true);
            this.m_DiaxeirisiProfil.setVisible(false);
            this.m_Agora.setVisible(false);
            // Ανοιξε την πρώτη φόρμα
            this.ShowjPanel(1);
        } else {
            //Είναι Χρήστης
            this.m_Diaxeirisi.setVisible(false);
            this.m_DiaxeirisiProfil.setVisible(true);
            this.m_Agora.setVisible(true);
            // Ανοιξε την πρώτη φόρμα
            this.ShowjPanel(5);
        }
    }

    private void UnCheckMenus() {
        m_DiaxeirisiKatastimaton.setSelected(false);
        m_DiaxeirisiProionton.setSelected(false);
        m_DiaxeirisiPelaton.setSelected(false);
        m_Relate_ProductStores.setSelected(false);
        m_editProfil.setSelected(false);
        m_ChangePass.setSelected(false);
        m_Checks.setSelected(false);
        m_agores.setSelected(false);
        m_Basket.setSelected(false);
    }

    // Κλείνει το παλιό jpanel και ανοίγει το καινούργιο
    public void ShowjPanel(int panelIndex) {
        // Αποθήκευσε τις Διαστάσεις του παραθύρου
        int w = this.getWidth();
        int h = this.getHeight();

        // UnCheck τα checkmenu
        this.UnCheckMenus();

        //Ελεγξε αν μου ζητάει να ανοίξω jpanel που ειναι ήδη active
        //αν ναι μην κάνεις τίποτα
        if (this.SelectedPanelIndex == panelIndex) {
            // v pr;epei na ftiaxtoyn ta check sta menu
            //this.m_DiaxeirisiKatastimaton.setSelected(true);
            //         return;
        }

        // κλείσε το παλιό jPanel αλλά διατήρησε τα data του
        getContentPane().removeAll();

        // Δείξε το νέο jPanel
        switch (panelIndex) {
            //====================== Μενου Administrator =======================
            // Διαχείριση καταστημάτων
            case 1:
                this.setTitle(SuperMarket.appTitle + "-Διαχείριση καταστημάτων");
                this.add((StoresPanel) this.panels.get(0));
                //this.add( new StoresPanel(db));
                m_DiaxeirisiKatastimaton.setSelected(true);
                break;

            case 2:
                // Διαχείριση Προιόντων
                this.setTitle(SuperMarket.appTitle + "-Διαχείριση Προιόντων ");
                //this.add(new ProductsPanel(db));
                this.add((ProductsPanel) this.panels.get(1));
                m_DiaxeirisiProionton.setSelected(true);

                break;

            case 3:
                // Διαχείριση Πελατών
                this.setTitle(SuperMarket.appTitle + "-Διαχείριση Πελατών  ");
                //this.add((new PelatesPanel(db, this)));
                this.add((PelatesPanel) this.panels.get(2));
                m_DiaxeirisiPelaton.setSelected(true);

                break;

            case 4:
                // Διαχείριση Προιόντων-Καταστημάτων
                this.setTitle(SuperMarket.appTitle + "-Διαχείριση Προιόντων Καταστημάτων   ");
                this.add(new RelateProductsStoresPanel(db));
                //this.add((RelateProductsStoresPanel) this.panels.get(3));
                m_Relate_ProductStores.setSelected(true);

                break;
            //========================== Μενου Πελάτη ==========================

            case 5:
                // Διαχείριση Προφίλ
                this.setTitle(SuperMarket.appTitle + "-Διαχείριση Προφίλ");
                this.add((EditProfilPanel) this.panels.get(4));
                m_editProfil.setSelected(true);

                break;

            case 6:
                // Αλλαγή Κωδικού πρόσβασης
                this.setTitle(SuperMarket.appTitle + "-Αλλαγή Κωδικού πρόσβασης ");
                this.add((ChangePasswordPanel) this.panels.get(5));
                m_ChangePass.setSelected(true);

                break;

            case 7:
                // Πληροφορίες Κερδισμένων Επιταγών
                this.setTitle(SuperMarket.appTitle + "-Πληροφορίες Κερδισμένων Επιταγών ");
                this.add((ChecksPanel) this.panels.get(6));
                m_Checks.setSelected(true);

                break;

            case 8:
                // Πραγματοποίηση Αγορών
                this.setTitle(SuperMarket.appTitle + "-Πραγματοποίηση Αγορών");
                this.add((MarketPlacePanel) this.panels.get(7));
                m_agores.setSelected(true);

                break;

            case 9:
                // Καλάθι Αγορών
                this.setTitle(SuperMarket.appTitle + "-Καλάθι Αγορών");
                this.add((ShowBasketPanel) this.panels.get(8));
                m_Basket.setSelected(true);

                break;

            //========================== προσομοίωση αγορών ====================
            case 10:
                // προσομοίωση αγορών
                this.setTitle(SuperMarket.appTitle + "-Προσομοίωση αγορών");
                this.add((SimulatePurchasesPanel) this.panels.get(9));
                break;

        }
        // Μαρκάρισε το Active jPanelIndex
        this.SelectedPanelIndex = panelIndex;

        // Κάντα όλα ορατά στον χρήστη
        // Stores.setLayout(new BoxLayout(Stores , BoxLayout.Y_AXIS));
        this.setLayout(new GridLayout(1, 1));
        this.pack();

        // Κάνε resize στις αρχικες διαστάσεις
        this.setSize(w, h);
        this.repaint();
    }

    public void logout() {
        // Κλείσε την mainForm και άνοιξε loginForm
        LoginForm LF = new LoginForm();
        this.dispose();
        LF.setVisible(true);
    }

    public ChecksPanel getUserChecksPanel() {
        return (ChecksPanel) this.panels.get(6);

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jFrame1 = new javax.swing.JFrame();
        jMenu2 = new javax.swing.JMenu();
        jMenuBar = new javax.swing.JMenuBar();
        m_file = new javax.swing.JMenu();
        m_changeUser = new javax.swing.JMenuItem();
        jMenuItem1 = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JPopupMenu.Separator();
        close_btn = new javax.swing.JMenuItem();
        m_Diaxeirisi = new javax.swing.JMenu();
        m_DiaxeirisiKatastimaton = new javax.swing.JCheckBoxMenuItem();
        m_DiaxeirisiProionton = new javax.swing.JCheckBoxMenuItem();
        m_DiaxeirisiPelaton = new javax.swing.JCheckBoxMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        m_Relate_ProductStores = new javax.swing.JCheckBoxMenuItem();
        m_DiaxeirisiProfil = new javax.swing.JMenu();
        m_editProfil = new javax.swing.JCheckBoxMenuItem();
        m_ChangePass = new javax.swing.JCheckBoxMenuItem();
        m_Checks = new javax.swing.JCheckBoxMenuItem();
        m_Agora = new javax.swing.JMenu();
        m_agores = new javax.swing.JCheckBoxMenuItem();
        m_Basket = new javax.swing.JCheckBoxMenuItem();

        javax.swing.GroupLayout jFrame1Layout = new javax.swing.GroupLayout(jFrame1.getContentPane());
        jFrame1.getContentPane().setLayout(jFrame1Layout);
        jFrame1Layout.setHorizontalGroup(
            jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        jFrame1Layout.setVerticalGroup(
            jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        jMenu2.setText("jMenu2");

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(620, 450));
        setName("MainForm"); // NOI18N

        jMenuBar.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jMenuBar.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));

        m_file.setText("File");

        m_changeUser.setText("Αλαγή Χρήστη");
        m_changeUser.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_changeUserActionPerformed(evt);
            }
        });
        m_file.add(m_changeUser);

        jMenuItem1.setText("Προσομοίωση αγορών ");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        m_file.add(jMenuItem1);
        m_file.add(jSeparator2);

        close_btn.setText("Κλείσε");
        close_btn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                close_btnActionPerformed(evt);
            }
        });
        m_file.add(close_btn);

        jMenuBar.add(m_file);

        m_Diaxeirisi.setText("Διαχείριση");

        m_DiaxeirisiKatastimaton.setText("Διαχείριση καταστημάτων");
        m_DiaxeirisiKatastimaton.setToolTipText("Θα ανοίγει κατάλληλη φόρμα που θα εμφανίζει πίνακα με τα ήδη καταχωρημένα καταστήματα αν υπάρχουν. \nΜέσω της φόρμας αυτής θα πρέπει να είναι εφικτή \nη δημιουργία ενός νέου καταστήματος, \nη τροποποίηση υπαρχόντων \nκαι η διαγραφή. ");
        m_DiaxeirisiKatastimaton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_DiaxeirisiKatastimatonActionPerformed(evt);
            }
        });
        m_Diaxeirisi.add(m_DiaxeirisiKatastimaton);

        m_DiaxeirisiProionton.setText("Διαχείριση προϊόντων");
        m_DiaxeirisiProionton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_DiaxeirisiProiontonActionPerformed(evt);
            }
        });
        m_Diaxeirisi.add(m_DiaxeirisiProionton);

        m_DiaxeirisiPelaton.setText("Διαχείριση προφίλ πελατών");
        m_DiaxeirisiPelaton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_DiaxeirisiPelatonActionPerformed(evt);
            }
        });
        m_Diaxeirisi.add(m_DiaxeirisiPelaton);
        m_Diaxeirisi.add(jSeparator1);

        m_Relate_ProductStores.setText("Συσχέτιση προϊόντων και καταστημάτων");
        m_Relate_ProductStores.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_Relate_ProductStoresActionPerformed(evt);
            }
        });
        m_Diaxeirisi.add(m_Relate_ProductStores);

        jMenuBar.add(m_Diaxeirisi);

        m_DiaxeirisiProfil.setText("Διαχείριση Προφίλ");

        m_editProfil.setText("Επεξεργασία προφίλ");
        m_editProfil.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_editProfilActionPerformed(evt);
            }
        });
        m_DiaxeirisiProfil.add(m_editProfil);

        m_ChangePass.setText("Αλλαγή κωδικού");
        m_ChangePass.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_ChangePassActionPerformed(evt);
            }
        });
        m_DiaxeirisiProfil.add(m_ChangePass);

        m_Checks.setText("Επιταγές");
        m_Checks.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_ChecksActionPerformed(evt);
            }
        });
        m_DiaxeirisiProfil.add(m_Checks);

        jMenuBar.add(m_DiaxeirisiProfil);

        m_Agora.setText("Αγορά");

        m_agores.setText("Πραγματοποίηση αγορών");
        m_agores.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_agoresActionPerformed(evt);
            }
        });
        m_Agora.add(m_agores);

        m_Basket.setText("Προβολή Καλαθιού");
        m_Basket.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                m_BasketActionPerformed(evt);
            }
        });
        m_Agora.add(m_Basket);

        jMenuBar.add(m_Agora);

        setJMenuBar(jMenuBar);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 620, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 455, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void close_btnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_close_btnActionPerformed
        // κατέστρεψε το παράθυρο
        dispose();
        // Τερμάτισε την εφαρμογή
        System.exit(0);
    }//GEN-LAST:event_close_btnActionPerformed

    private void m_DiaxeirisiKatastimatonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_DiaxeirisiKatastimatonActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 1;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_m_DiaxeirisiKatastimatonActionPerformed

    private void m_DiaxeirisiProiontonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_DiaxeirisiProiontonActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 2;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_m_DiaxeirisiProiontonActionPerformed

    private void m_DiaxeirisiPelatonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_DiaxeirisiPelatonActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 3;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_m_DiaxeirisiPelatonActionPerformed

    private void m_Relate_ProductStoresActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_Relate_ProductStoresActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 4;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_m_Relate_ProductStoresActionPerformed

    private void m_editProfilActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_editProfilActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 5;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_m_editProfilActionPerformed

    private void m_ChangePassActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_ChangePassActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 6;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_m_ChangePassActionPerformed

    private void m_ChecksActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_ChecksActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 7;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_m_ChecksActionPerformed

    private void m_agoresActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_agoresActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 8;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_m_agoresActionPerformed

    private void m_BasketActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_BasketActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 9;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_m_BasketActionPerformed

    private void m_changeUserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_changeUserActionPerformed
        this.logout();
    }//GEN-LAST:event_m_changeUserActionPerformed

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        // Θέσε το index αυτού του jPanel
        int jPanelIndex = 10;
        // Ανοιξε το jPanel
        ShowjPanel(jPanelIndex);
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {

            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        //     java.awt.EventQueue.invokeLater(new Runnable() {
        //        public void run() {
        //             new MainForm().setVisible(true);
        //        }
        //   });

    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem close_btn;
    private javax.swing.JFrame jFrame1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JPopupMenu.Separator jSeparator2;
    private javax.swing.JMenu m_Agora;
    private javax.swing.JCheckBoxMenuItem m_Basket;
    private javax.swing.JCheckBoxMenuItem m_ChangePass;
    private javax.swing.JCheckBoxMenuItem m_Checks;
    private javax.swing.JMenu m_Diaxeirisi;
    private javax.swing.JCheckBoxMenuItem m_DiaxeirisiKatastimaton;
    private javax.swing.JCheckBoxMenuItem m_DiaxeirisiPelaton;
    private javax.swing.JMenu m_DiaxeirisiProfil;
    private javax.swing.JCheckBoxMenuItem m_DiaxeirisiProionton;
    private javax.swing.JCheckBoxMenuItem m_Relate_ProductStores;
    private javax.swing.JCheckBoxMenuItem m_agores;
    private javax.swing.JMenuItem m_changeUser;
    private javax.swing.JCheckBoxMenuItem m_editProfil;
    private javax.swing.JMenu m_file;
    // End of variables declaration//GEN-END:variables
}
